import type { ProgramEnum } from '@/global/enum/windows.enum';
import type { FormInstance, TableColumnProps } from 'ant-design-vue';
import type { RadioGroupChildOption } from 'ant-design-vue/es/radio/Group';
import type { OptionType } from 'ant-design-vue/es/select';
import type { SelectionItem } from 'ant-design-vue/es/table/interface';

export interface MenuItem {
  path: string;
  meta: Meta;
  sort?: number;
  redirect?: string;
  children?: MenuItem[];
  props?: boolean;
}
export interface TreeNode {
  id: number;
  label: string;
  children: TreeNode[];
}
interface Meta {
  icon: string;
  title: string;
}
export interface SystemWindow {
  /* 窗口标题，必填 */
  title: string;
  x?: number;
  y?: number;
  w?: number;
  h?: number;
  z?: number;
  /* 窗口渲染的组件 /YourComponent.vue */
  component: any;
  /* 用于增删改查 */
  id?: ProgramEnum | string;
  /* 将要传入到窗口的值，非常重要，用于更新/添加值 */
  data?: any;
  /* 是否隐藏 */
  hidden?: boolean;
  /* 窗口左上的图片，不填则有默认图标 */
  icon?: string;
  /* 黑暗模式 */
  dark?: boolean;
  /* 最大化 */
  maximize?: boolean;
  /* 是否允许调整大小 */
  resizable?: boolean;
  /* 是否允许拖拽 */
  draggable?: boolean;
}

/* 系统表格 */
export interface ColumnProps extends TableColumnProps {
  show?: boolean;
}

/* 系统图标类型，与仓库resource中的路径保持一致 */
export type IconType = 'image-icon' | 'avatar' | 'wallpaper' | 'system';

/* 文件上传返回 */
export interface UploadResponse {
  msg: string;
  fileName: string;
  code: number;
  newFileName: string;
  url: string;
  originalFilename: string;
  size: number;
}

interface FormItem<T> {
  /* 用于删除动态表单 */
  id: string;
  /* 实际数据 */
  data: T;
}
export interface FormConfig<T> {
  /* 原始数据 */
  raw: T;
  /* 是否显示表单 */
  display: boolean;
  /* 当前选中的 <T> */
  current: T;
  /* 重置表单 */
  reset?: () => any;
}

/*
  三向绑定接口
  前三个必填
  待更新的接口列表
*/
export interface PendingUpdates {
  /* 必填，字段名,注意和数据库中的字段名保持一致 */
  fieldName: string;
  /* 必填，当前数据的ID */
  id: string | number | boolean;
  /* 必填，需要更新的值 */
  modelValue: any;
  /* 渲染的类型 */
  componentType?: 'input' | 'radio' | 'select' | 'checkbox' | 'radio-group';
  /* 如果是select类型,需要提供一个选项 */
  options?: SelectionItem[] | RadioGroupChildOption[] | OptionType[];
  /* 传递更新的axios方法 */
  updateFunc: (arg?: any) => any;
}
